#include "timer.h"

int64_t Timer::gid = 0;

// 获取系统启动到现在的时间戳,单位:毫秒
time_t Timer::GetTick()
{
    auto sc = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now());
    auto temp = std::chrono::duration_cast<std::chrono::milliseconds>(sc.time_since_epoch());
    return temp.count();
}

int64_t Timer::GenID()
{
    return ++gid;
}

// 添加定时器
TimerNodeBase Timer::AddTimer(time_t msec, TimerNode::Callback func, bool always)
{
    TimerNode tnode;
    tnode.expire = GetTick() + msec;
    tnode.func = func;
    tnode.id = GenID();
    // 扩展:如果需要一直执行
    tnode.always = always;
    tnode.gap = msec;
    // 将定时任务加入某个数据结构中
    timermap.insert(tnode);
    return static_cast<TimerNodeBase>(tnode);
}

// 删除定时器
bool Timer::DelTimer(TimerNodeBase& node)
{
    // 在数据结构中删除某个定时任务
    auto iter = timermap.find(node);
    if (iter != timermap.end())
    {
        timermap.erase(iter);
        return true;
    }
    return false;
}

// 检查定时器
bool Timer::CheckTimer()
{
    // 先找到某个数据结构最小的节点
    auto iter = timermap.begin();
    if (iter != timermap.end() && iter->expire <= GetTick())
    {
        iter->func(*iter);  // 执行定时任务
        // 扩展:如果需要一直执行
        if (iter->always)
        {
            // 重新添加定时器
            AddTimer(iter->gap, iter->func, iter->always);
        }
        timermap.erase(iter);
        return true;
    }
    return false;
}

// 最近触发的定时任务离当前还要多久
time_t Timer::TimeToSleep()
{
    auto iter = timermap.begin();
    if (iter == timermap.end())
    {
        return -1;
    }
    time_t diss = iter->expire - GetTick();
    return diss > 0 ? diss : 0;
}
